package pers.amos.eshop.request.support;

import pers.amos.eshop.model.ProductInventory;
import pers.amos.eshop.request.Request;
import pers.amos.eshop.service.ProductInventoryService;

/**
 * @author amos wong
 * @create 2020-11-14 3:56 下午
 * <p>
 * 比如说一个商品发生了交易，那么就要修改这个商品对应的库存
 * 此时就会发送请求过来，要求修改库存，那么这个可能就是所谓的data update request，数据更新请求
 * cache aside pattern
 * （1）删除缓存
 * （2）更新数据库
 */

public class ProductInventoryDBUpdateRequest implements Request {

    private ProductInventory productInventory;

    private ProductInventoryService inventoryService;

    public ProductInventoryDBUpdateRequest(ProductInventory productInventory, ProductInventoryService inventoryService) {
        this.productInventory = productInventory;
        this.inventoryService = inventoryService;
    }

    /**
     * 执行业务逻辑的方法：
     * 1.删除缓存
     * 2.更新数据库
     */
    @Override
    public void process() {
        System.out.println("===========日志===========: 数据库更新请求开始执行，商品id=" + productInventory.getProductId() + ", 商品库存数量=" + productInventory.getInventoryCnt());
        inventoryService.removeProductInventoryCache(productInventory);
        // 为了模拟演示先删除了redis中的缓存，然后还没更新数据库的时候，读请求过来了，这里可以人工sleep一下
        try {
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        inventoryService.updateProductInventory(productInventory);
    }

    @Override
    public Long getProductId() {
        return productInventory.getProductId();
    }

    @Override
    public Boolean isForceRefresh() {
        return false;
    }
}
